package com.yqh.Collection;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;

/**
 * Collection 集合的常用方法
 * @author 阳秋豪
 * @createTime 2024/3/5
 */
public class Test2 {
    public static void main(String[] args) {
        /*----------- Collection 的常用方法 ------------*/
        Collection<String> collection = new ArrayList<>(); // 多态写法：父类（接口）指向子类实例（实现类实例）
        // 1、boolean add(E e);
        // -- 如果这个集合因为调用而改变则返回true
        System.out.println("--------------------------------");
        System.out.println(collection);
        collection.add("1");
        System.out.println("修改后 -- " + collection); // 修改后 -- [1]

        // 2、void clear();
        // -- 清空这个集合所有元素（可选）
        // -- 可能异常：UnsupportedOperationException 操作的集合不支持清空时出现
        System.out.println("--------------------------------");
        System.out.println(collection);
        collection.clear();
        System.out.println("修改后 -- " + collection); // 修改后 -- []

        // 3、boolean isEmpty();
        // -- 如果这个集合不包含元素，返回true
        System.out.println("--------------------------------");
        System.out.println(collection);
        boolean empty = collection.isEmpty();
        System.out.println((empty ? "集合为空" : "集合不为空") + " -- empty = " + empty); // 集合为空 -- empty = true

        // 4、int size();
        // -- 返回集合中的元素个数
        for (int num = 10; num > 0; num--) {
            collection.add(String.valueOf(num));
        }
        System.out.println("--------------------------------");
        System.out.println(collection);
        System.out.println("集合大小 -- " + collection.size()); // 集合大小 -- 10

        // 5、boolean contains(Object o);
        // -- 如果这个集合包含指定元素则返回 true
        // -- 可能异常：ClassCastException 指定元素与集合类型不相容时出现
        // -- 可能异常：NullPointerException 指定元素为 null 且集合中不允许出现 null 时出现
        System.out.println("--------------------------------");
        System.out.println(collection);
        System.out.println("集合包含5吗？ -- " + collection.contains("5")); // true
        System.out.println("集合包含11吗？ -- " + collection.contains("11")); // false

        // 6、boolean remove(Object o);
        // 描述 -- 删除指定元素的单个实例，如果指定元素有多个则删除第一个
        // 返回值 -- 如果一个元素因为调用而更改则返回 true
        // 可能异常 -- ClassCastException 指定元素与集合类型不相容时出现
        // 可能异常 -- NullPointerException 指定元素为 null 且集合中不允许出现 null 时出现
        // 可能异常 -- UnsupportedOperationException 集合没有删除权限时出现
        System.out.println("--------------------------------");
        collection.add("10");
        System.out.println(collection); // [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 10]
        boolean result1 = collection.remove("10");
        System.out.println("删除10 -- " + collection + "、删除结果 -- " + result1); // 删除10 -- [9, 8, 7, 6, 5, 4, 3, 2, 1, 10]、删除结果 -- true
        boolean result2 = collection.remove("11");
        System.out.println("删除11 -- " + collection + "、删除结果 -- " + result2); // 删除11 -- [9, 8, 7, 6, 5, 4, 3, 2, 1, 10]、删除结果 -- false

        // 7、 Object[] toArray();
        // 描述 -- 返回包含集合所有元素的数组，如果这个集合维护了一个迭代器 iterator 则返回的数组顺序必须和集合顺序相同
        System.out.println("--------------------------------");
        System.out.println(collection);
        Object[] array = collection.toArray(); // [9, 8, 7, 6, 5, 4, 3, 2, 1, 10]
        System.out.println("array.length -- " + array.length); // array.length -- 10

        // 8、boolean addAll(Collection<? extends E> c);
        // 描述 -- 将指定集合中的所有元素添加到此元素中
        // 返回值 -- 如果集合因为调用而更改则返回 true
        System.out.println("--------------------------------");
        System.out.println(collection); // [9, 8, 7, 6, 5, 4, 3, 2, 1, 10]
        Collection<String> collection2 = new ArrayList<>();
        collection2.add("9");
        collection2.add("10");
        System.out.println("collection2 -- " + collection2); // collection2 -- [9, 10]
        boolean b = collection.addAll(collection2);
        System.out.println("将 collection2 集合添加到 collection 集合中是否成功 -- " + b); // 将 collection2 集合添加到 collection 集合中是否成功 -- true
        System.out.println("添加后的 collection -- " + collection); // 添加后的 collection -- [9, 8, 7, 6, 5, 4, 3, 2, 1, 10, 9, 10]

        /*------------------- 问题 --------------------*/
        // 集合明明有泛型可以指定类型为什么 toArray() 方法还是用 Object 类型返回？
        // 答：泛型只是在编译阶段进行检查，当运行阶段时就会被擦除，而运行阶段也有其他方式对集合进行更改，为了不出现 ClassCastException 异常这里设置成Object类型最好
    }
}
